#include "head.h"

// 顺序表的创建
S_arr_list * S_Arr_Init(void)
{
    S_arr_list * L = (S_arr_list*)malloc(sizeof(S_arr_list));
    if (L == NULL)
    {
        ERRLOG("顺序表创建失败\n");
        return NULL;
    }
    memset(L->data,0,sizeof(F_data) * ARR_MAX_SIZ);
    L->len = 0;
    return L;
}

// 顺序表的插入
int S_Arr_insert(S_arr_list * L , int pos , F_data data)
{
    if (L == NULL) 
    {
        printf("顺序表 为 NULL\n");
        return -1;
    }
    if (L->len >= ARR_MAX_SIZ) 
    {
        printf("顺序表已满\n");
        return -1;
    }
    if (pos < 1 || pos > L->len + 1) 
    {
        printf("插入位置不合法\n");
        return -1;
    }

    // 从插入点开始后移数据
    for (int i = L->len; i >= pos; i--) 
    {
        L->data[i] = L->data[i - 1];
    }

    L->data[pos - 1] = data;
    L->len++;
    return 0;
}

// 顺序表的删除
F_data S_Arr_delete(S_arr_list * L , int pos )
{
    F_data removed_data = {0};

    if (L == NULL) {
        printf("顺序表 为 NULL\n");
        return removed_data;
    }
    if (L->len == 0) {
        printf("顺序表内无数据\n");
        return removed_data;
    }
    if (pos < 1 || pos > L->len) {
        printf("删除位置不合法\n");
        return removed_data;
    }

    removed_data = L->data[pos - 1];

    // 将后续数据前移
    for (int i = pos; i < L->len; i++) {
        L->data[i - 1] = L->data[i];
    }

    L->len--;
    return removed_data;
}

// 顺序表的查找
int find_by_name(S_arr_list * L , char * name);

// 顺序表的遍历
void S_Arr_printf(S_arr_list * L)
{
    if (L == NULL) {
        printf("顺序表 为 NULL\n");
        return;
    }
    if (L->len == 0) {
        printf("顺序表内无数据\n");
        return;
    }

    for (int i = 0; i < L->len; i++) {
        printf("班次: %d 机型: %s 起点站: %s 终点站: %s 起飞时间: %02d:%02d 到达时间: %02d:%02d 飞行时间: %s 票价: %d 载客量: %d 剩余座位: %d 是否飞: %c\n",
               L->data[i].id, L->data[i].flighttype, L->data[i].startcity, L->data[i].arrivecity,
               L->data[i].starttime[0], L->data[i].starttime[1], L->data[i].arrivetime[0], L->data[i].arrivetime[1],
               L->data[i].flytime, L->data[i].value, L->data[i].maxNUM, L->data[i].leftbuyersa, L->data[i].whetherfly);
    }
}

//向文件写入用户航班信息
void S_Arr_File_print(S_arr_list * L)
{
    if (L == NULL) {
        printf("顺序表 为 NULL\n");
        return;
    }
    FILE *fp = fopen(USER_FLIGHT_FILE,"w");
    if (fp == NULL)
    {
        printf("文件创建失败\n");
        return;
    }
    fseek(fp,0,SEEK_SET);
    for (size_t i = 0; i < L->len; i++)
    {
        fprintf(fp,"班次: %d 机型: %s 起点站: %s 终点站: %s 起飞时间: %02d:%02d 到达时间: %02d:%02d 飞行时间: %s 票价: %d 载客量: %d 剩余座位: %d 是否飞: %c\n",
               L->data[i].id, L->data[i].flighttype, L->data[i].startcity, L->data[i].arrivecity,
               L->data[i].starttime[0], L->data[i].starttime[1], L->data[i].arrivetime[0], L->data[i].arrivetime[1],
               L->data[i].flytime, L->data[i].value, L->data[i].maxNUM, L->data[i].leftbuyersa, L->data[i].whetherfly);
    }
    fflush(fp);
    fclose(fp);
}

//向文件读入用户航班信息
void S_Arr_File_scanf(S_arr_list * L)
{
    if (L == NULL) {
        printf("顺序表 为 NULL\n");
        return;
    }
    FILE *fp = fopen(USER_FLIGHT_FILE,"r");
    if (fp == NULL)
    {
        printf("文件打开失败\n");
        return;
    }
    fseek(fp,0,SEEK_SET);
    L->len = 0;
    F_data data;
    char ch = 0;
    int pos = 0;
    //检测文件行数
    while ((ch = fgetc(fp)) != EOF)
    {
        if (ch == '\n')
        {
            pos++;
        }
    }
    //移动光标
    fseek(fp, 0, SEEK_SET);
    for (size_t i = 0; i < L->len; i++)
    {
        fscanf(fp,"班次: %d 机型: %s 起点站: %s 终点站: %s 起飞时间: %02d:%02d 到达时间: %02d:%02d 飞行时间: %s 票价: %d 载客量: %d 剩余座位: %d 是否飞: %c\n",
               &data.id, data.flighttype, data.startcity, data.arrivecity,
               &data.starttime[0],&data.starttime[1], &data.arrivetime[0], &data.arrivetime[1],
               data.flytime, &data.value, &data.maxNUM, &data.leftbuyersa, &data.whetherfly);
        S_Arr_insert(L,i+1,data);
    }
    fflush(fp);
    fclose(fp);
}